package com.lin.carbon.utils;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * Md5Utils 工具类，用于对输入的字符串进行 MD5 加密操作。
 */
public class Md5Utils {
    /**
     * 对输入的字符串进行 MD5 加密
     * @param input 输入的待加密字符串
     * @return 经过 MD5 加密后的 32 位十六进制字符串
     */
    // 定义一个静态方法 md5，接收一个字符串类型的参数 input，用于传入待加密的字符串
    // 静态方法可以直接通过类名调用，无需创建类的实例
    public static String md5(String input) {
        try {
            // 通过 MessageDigest 类的 getInstance 方法获取 MD5 算法的实例
            // MessageDigest 类提供了消息摘要算法的功能，如 MD5、SHA 等
            MessageDigest md = MessageDigest.getInstance("MD5");
            // 调用 digest 方法对输入字符串的字节数组进行 MD5 哈希计算
            // getBytes() 方法将输入字符串转换为字节数组
            byte[] messageDigest = md.digest(input.getBytes());
            // 创建一个 StringBuilder 对象，用于拼接加密后的十六进制字符串
            // StringBuilder 是可变的字符序列，在频繁拼接字符串时效率较高
            StringBuilder hexString = new StringBuilder();
            // 遍历经过 MD5 计算后的字节数组
            for (byte b : messageDigest) {
                // 将字节转换为无符号整数，并以十六进制字符串形式表示
                // 0xFF & b 是为了将字节转换为 0 - 255 之间的无符号整数
                String hex = Integer.toHexString(0xFF & b);
                // 如果转换后的十六进制字符串长度为 1，则在前面补 0
                // 确保每个字节都用两位十六进制数表示
                if (hex.length() == 1) {
                    hexString.append('0');
                }
                // 将处理后的十六进制字符串追加到 StringBuilder 中
                hexString.append(hex);
            }
            // 将 StringBuilder 中的内容转换为字符串并返回
            return hexString.toString();
        } catch (NoSuchAlgorithmException e) {
            // 如果指定的算法（这里是 MD5）不可用，抛出运行时异常
            throw new RuntimeException(e);
        }
    }
}